package com.party.core.service.mall.impl;

import com.google.common.base.Strings;
import com.google.common.collect.Maps;
import com.party.common.paging.Page;
import com.party.core.dao.read.mall.MallGoodsSpecReadDao;
import com.party.core.dao.write.mall.MallGoodsSpecWriteDao;
import com.party.core.model.BaseModel;
import com.party.core.model.mall.MallGoodsSpec;
import com.party.core.model.mall.MallGoodsSpecOutput;
import com.party.core.service.mall.IMallGoodsSpecService;
import com.sun.istack.NotNull;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 商品规格服务实现
 * Created by wei.li
 *
 * @date 2017/8/15 0015
 * @time 18:34
 */

@Service
public class MallGoodsSpecService implements IMallGoodsSpecService {


    @Autowired
    private MallGoodsSpecReadDao mallGoodsSpecReadDao;

    @Autowired
    private MallGoodsSpecWriteDao mallGoodsSpecWriteDao;

    /**
     * 规格关系插入
     *
     * @param mallGoodsSpec 规格
     * @return 插入结果
     */
    @Override
    public String insert(MallGoodsSpec mallGoodsSpec) {
        BaseModel.preInsert(mallGoodsSpec);
        boolean result = mallGoodsSpecWriteDao.insert(mallGoodsSpec);
        if (result) {
            return mallGoodsSpec.getId();
        }
        return null;
    }

    /**
     * 规格关系更新
     *
     * @param mallGoodsSpec 规格
     * @return 更新结果（true/false）
     */
    @Override
    public boolean update(MallGoodsSpec mallGoodsSpec) {
        return mallGoodsSpecWriteDao.update(mallGoodsSpec);
    }

    /**
     * 逻辑删除
     *
     * @param id 实体主键
     * @return 删除结果（true/false）
     */
    @Override
    public boolean deleteLogic(@NotNull String id) {
        if (Strings.isNullOrEmpty(id)) {
            return false;
        }
        return mallGoodsSpecWriteDao.deleteLogic(id);
    }

    /**
     * 物理删除
     *
     * @param id 实体主键
     * @return 删除结果（true/false）
     */
    @Override
    public boolean delete(@NotNull String id) {
        if (Strings.isNullOrEmpty(id)) {
            return false;
        }
        return mallGoodsSpecWriteDao.delete(id);
    }

    /**
     * 批量逻辑删除
     *
     * @param ids 主键集合
     * @return 删除结果（true/false）
     */
    @Override
    public boolean batchDeleteLogic(@NotNull Set<String> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return false;
        }
        return mallGoodsSpecWriteDao.batchDeleteLogic(ids);
    }

    /**
     * 批量删除
     *
     * @param ids 主键集合
     * @return 删除结果（true/false）
     */
    @Override
    public boolean batchDelete(@NotNull Set<String> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return false;
        }
        return mallGoodsSpecWriteDao.batchDelete(ids);
    }

    /**
     * 获取
     *
     * @param id 主键
     * @return 规格
     */
    @Override
    public MallGoodsSpec get(String id) {
        return mallGoodsSpecReadDao.get(id);
    }

    /**
     * 分页查询
     *
     * @param mallGoodsSpec 规格
     * @param page            分页信息
     * @return 列表
     */
    @Override
    public List<MallGoodsSpec> listPage(MallGoodsSpec mallGoodsSpec, Page page) {
        return mallGoodsSpecReadDao.listPage(mallGoodsSpec, page);
    }

    /**
     * 查询所有
     *
     * @param mallGoodsSpec 规格
     * @return 列表
     */
    @Override
    public List<MallGoodsSpec> list(MallGoodsSpec mallGoodsSpec) {
        return mallGoodsSpecReadDao.listPage(mallGoodsSpec, null);
    }

    /**
     * 根据产品编号查询
     *
     * @param productId 产品编号
     * @return 规格关系编号
     */
    @Override
    public List<MallGoodsSpec> findByProductId(String productId) {
        MallGoodsSpec mallGoodsSpec = new MallGoodsSpec();
        mallGoodsSpec.setProductId(productId);
        return this.list(mallGoodsSpec);
    }

    @Override
    public MallGoodsSpec getUnique(MallGoodsSpec productSpec) {
        return mallGoodsSpecReadDao.getUnique(productSpec);
    }

    @Override
    public List<Map<String, Object>> batchProductList(Map<String, Object> params) {
        return mallGoodsSpecReadDao.batchProductList(params);
    }

    @Override
    public List<MallGoodsSpec> batchList(@NotNull Set<String> ids, MallGoodsSpec mallGoodsSpec, Page page) {
        return null;
    }

    @Override
    public Map<String, String> getProductSpec(String goodsId, String delFlag) {
        Map<String, String> result = Maps.newHashMap();
        List<Map<String, String>> productSpecs = mallGoodsSpecReadDao.getProductSpec(goodsId, delFlag);
        for (Map<String, String> productSpec : productSpecs) {
            String models = productSpec.get("models");
            String productId = productSpec.get("productId");
            result.put(productId, models);
        }
        return result;
    }

    @Override
    public List<MallGoodsSpec> findBySpecValueId(String specValueId) {
        MallGoodsSpec mallGoodsSpec = new MallGoodsSpec();
        mallGoodsSpec.setSpecValueId(specValueId);
        return mallGoodsSpecReadDao.listPage(mallGoodsSpec, null);
    }

    @Override
    public List<MallGoodsSpec> findByGoodsId(String goodsId) {
        MallGoodsSpec mallGoodsSpec = new MallGoodsSpec();
        mallGoodsSpec.setGoodsId(goodsId);
        return mallGoodsSpecReadDao.listPage(mallGoodsSpec, null);
    }

    @Override
    public List<MallGoodsSpec> findByGoodsIdDelFlag(String goodsId) {
        MallGoodsSpec mallGoodsSpec = new MallGoodsSpec();
        mallGoodsSpec.setGoodsId(goodsId);
        mallGoodsSpec.setDelFlag(BaseModel.DEL_FLAG_NORMAL);
        return mallGoodsSpecReadDao.listPage(mallGoodsSpec, null);
    }

    @Override
    public List<MallGoodsSpec> findBySpecId(String specId) {
        MallGoodsSpec mallGoodsSpec = new MallGoodsSpec();
        mallGoodsSpec.setSpecId(specId);
        return mallGoodsSpecReadDao.listPage(mallGoodsSpec, null);
    }

    /**
     * 获取某商品的产品和规格分类
     * @param id: 商品id
     * @return
     */
    @Override
    public MallGoodsSpecOutput specs(String id) {
        return mallGoodsSpecReadDao.specs(id);
    }

    @Override
    public void deleteByGoodsId(String goodsId) {
        mallGoodsSpecWriteDao.deleteByGoodsId(goodsId);
    }
}
